// 定义每个切片的大小为5MB
const CHUNK_SIZE = 5 * 1024 * 1024; 

// 定义线程数，使用硬件并发核心数，如果获取不到则默认为4
const THREAD_COUNT = navigator.hardwareConcurrency || 4; 

// 文件切片主函数，接收一个File对象作为参数
export async function cutFile(file) { 
    // 创建Promise用于异步处理
    return new Promise(async (resolve, reject) => { 
        // 计算文件需要切分成多少个切片
        const chunkCount = Math.ceil(file.size / CHUNK_SIZE); 
        // 计算每个线程需要处理的切片数量
        const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT); 
        // 存储所有切片结果的数组
        const result = []; 
        // 记录已完成切片的线程数量
        let finishCount = 0; 
        // 输出每个线程需要处理的切片数量到控制台
        console.log('threadCount', threadChunkCount); 
        
        // 创建多个Web Worker线程来并行处理文件切片
        for (let i = 0; i < THREAD_COUNT; i++){
            // 创建Web Worker线程，指定处理逻辑在worker.js文件中
            const worker = new Worker('./worker.js',{
               
            })
            
            // 计算当前线程处理的切片起始索引
            const start = i * threadChunkCount; 
            // 计算当前线程处理的切片结束索引
            const end =  (i+1)* threadChunkCount; 
            
            // 向Worker线程发送消息，传递文件切片任务
            worker.postMessage({ 
                file,
                CHUNK_SIZE,
                startChunkIndex:start,
                endChunkIndex:end<= chunkCount ? end:chunkCount, 
            
            })
            
            // 监听Worker线程返回的消息
            worker.onmessage = e => { 
                // 将Worker返回的切片数据存入结果数组的对应位置
                for (let i =start; i < end; i++){
                    result[i] = e.data[i-start]
                }
                
                // 销毁当前Worker线程以释放资源
                worker.terminate(); 
                // 增加完成线程计数
                finishCount++; 
                
                // 当所有线程都完成任务时，resolve Promise返回结果
                if (finishCount === THREAD_COUNT) { 
                    resolve(result)
                }
            }
        }
    });
}